///////////////////////////////////////
////      ANALIZADOR LÉXICO        ////
///////////////////////////////////////

lexer grammar Analex;

options {
  language = Java;
  k = 9;
}

tokens {

}

@header {
  package practpl.cincomod;
}

  INT : 'int ';
  LONG : 'long';
  DO : 'do ';
  DOUBLE : 'double';
  FLOAT : 'float';
  SHORT : 'short';
  CHAR : 'char';
  STRING2 : 'String';
  UNSIGNED : 'unsigned';
  SIGNED : 'signed';
  RETURN : 'return';
  VOID : 'void';
  FOR : 'for';
  WHILE : 'while';
  IF : 'if';
  ELSE : 'else';

  fragment NUEVA_LINEA: '\r\n';
  BLANCO: (' '|'\t'|NUEVA_LINEA) {$channel=HIDDEN;};
  SALTO: '\n';
  BARRAINVERTIDA: '\\';
  
  fragment DIGITO: '0'..'9';
  NUMERO : (DIGITO)+ ('.' (DIGITO)+)?;
  
  fragment LETRA: ('A'..'Z')|('a'..'z');
//  IDENT : (LETRA)((DIGITO)|(LETRA))*;
  NOMBRE : (LETRA|GUIONBAJO) (LETRA|DIGITO|GUIONBAJO|MENOS)*;
  
  MAS: '+';
  MENOS: '-';
  INCREMENTO: '++';
  DECREMENTO: '--';
  fragment GUIONBAJO: '_';
  BARRA: '/';
  OR: '|';
  ASTERISCO: '*';
  PARENTESISA: '(';
  PARENTESISC: ')';
  CORCHETEA: '[';
  CORCHETEC: ']';
  LLAVEA: '{';
  LLAVEC: '}';
  PUNTOCOMA: ';';
  COMA: ',';
  PUNTO: '.';
  IGUAL : '=';
  SEPARADOR: '%%';
  ABRE_SCC : '%{';
  CIERRA_SCC: '%}';
  PORCENTAJE : '%';
  AND: '&';
  COMILLAS: '"';
  
  RANGO: ((LETRA MENOS LETRA (LETRA MENOS LETRA)?) | (DIGITO MENOS DIGITO)) ;
  
  PATRON: LLAVEA NOMBRE LLAVEC (MAS)?;
  PATRON_MULT: (PARENTESISA PATRON (OR PATRON)+ PARENTESISC) (ASTERISCO)?;
  
  STRING: '"' (.)* '"';
  
  COMENTARIO: '/*' (.)* '*/' {skip();}; 